package modules::chatanaliz;

use module;
use vars '@ISA';
@ISA = ("module");
use DBI;
use encoding "utf8";
use utf8;
use IO::File;
use Net::Netcraft::Query;

my $misc = misc->new();


sub got_groupchat_analiz {
    my ($pkg,%args) = @_;
    my (@words_az) = split(/ /,$args{body}); # тело сообщения
    my (@from_az) = split(/ /,$args{from}); # jid конференции
# $args{resource} - ник отправителя 
# $args{jid} - jid конференции
# $args{tag} - message
# $args{type} - groupchat
# $args{other} - HASH(0x8aa9470)

#if ($args{resource} ne "$::nickname") {
#open (TEXTY, ">>../markov");
#print TEXTY "$args{body} ";
#close TEXTY;
#}

if ($words_az[0] eq "аяп") {
    while ( local ($first_chan,$last_chan) = each(%::spisokjidov)) {
	$spisokjid .= "$first_chan $last_chan\n";
	@chan = split(/\//,$first_chan);
	push (@{$chan[0]},"$last_chan");
	push (@spisok_konf_nesort,$chan[0]);
    }
    %seen=();
    @spisok_konf_sort=grep{!$seen{$_}++}@spisok_konf_nesort;
    foreach(@spisok_konf_sort) {
	if ($words_az[1] eq "$_") {
		%seen=();
		@{$_}=grep{!$seen{$_}++}@{$_};
		main::SendMessage(to => $args{from}, type => 'groupchat', body => "В конференции $_:\n @{$_}");
	}
    }
    $spisokjid="";
    @{$chan[0]}=();
    @spisok_konf_sort=();
}

# Список конференций
if ($words_az[0] eq "конфы") {
while ( ($first_kon,$last_kon) = each(%::spisokkonf)) {
my $usercount = $::conf_list->users(confa => $first_kon);
$spisokkon .= "$first_kon ($usercount)\n";
}
main::SendMessage(to => $args{from}, type => 'groupchat', body => "$spisokkon");
$spisokkon="";
}

# Тесты
if ($words_az[0] eq "тест") {
    shift @words_az;
    undef $rezultat;
    if ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq да) {
	$rezultat = $misc->affil(from => $args{from}, resource => "@words_az");
    } elsif ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq нет) {
	$rezultat = "$args{resource}: @words_az нет в конференции $args{from}";
    } else {
	$rezultat = "$args{resource}: неизвестная ошибка.";
    }
    main::SendMessage(to => $args{from}, type => 'groupchat', body => $rezultat);
}
	
# Информация о сайте
if ($words_az[0] eq "сайт") {

	$res = validateUrl($words_az[1]);
	if($res) {
		$words_az[1]  =~ s!(http://||ftp://||https://)!!;
		my $req = Net::Netcraft::Query->new(
			site => $words_az[1],
		);
		%res = $req->query;
		foreach $key (keys %res) {
			my $tmp = $res{$key};
			$key =~ s/history_(\d)$/history_0$1/;
			$res2{$key} = $tmp;
		}
		foreach (sort keys %res2) {
			$netcraft .= "$_: $res2{$_}\n";
		}
		main::SendMessage(to => $args{from}, type => 'groupchat', body => "\n$netcraft\n");
	} else {
		main::SendMessage(to => $args{from}, type => 'groupchat', body => "Неправильный URL\n");
	}
	undef $netcraft;
	%res2 = ();
}

# Информация о веб сервере
if ($words_az[0] eq "сервер") {
    $http = new HTTP::Lite;
    $res = validateUrl($words_az[1]);
    $req = $http->request($words_az[1]) 
        or die "Unable to get document: $!";
    #print $http->body();
    print $http->get_header('p');
    @headers = $http->headers_array();
    $body = $http->body();
    foreach $header (@headers)
    {
      main::SendMessage(to => $args{from}, type => 'groupchat', body => "$header\n") if $header =~ s/Server: //;
    }
}

# Дамп аргументов
if ($words_az[0] eq "дамп") {
	
	main::SendMessage(to => $args{from}, type => 'groupchat', body => "Дамп: $args{jid}");
}

# Перевод текста
if ($words_az[0] eq "перевод") {
    use Data::Dumper;

    my ($msg, $xl8r);
    shift @words_az;
    if ($words_az[0] eq "ра") {
        $xl8r = Lingua::Translate->new(src => "ru",
                                   dest => "en")
     or $msg = "ошибочка";
    } elsif ($words_az[0] eq "ар") {
        $xl8r = Lingua::Translate->new(src => "en",
                                   dest => "ru")
     or $msg = "ошибочка";
     print "$xl8r er";
    } else {
        $msg = "Направление перевода $words_az[0] не найдено.";
    }
    shift @words_az;
    my $wrz = join " ", @words_az;
    utf8::encode($wrz) if ($words_az[0] eq "ра");
    $msg = $xl8r->translate($wrz);
    utf8::decode($msg);
    main::SendMessage(to => $args{from}, type => 'groupchat', body => "$args{resource}: $msg");
}

# Ильхам копипаста
if ($words_az[0] eq "ильхам") {
	main::SendMessage(to => $args{from}, type => 'groupchat', body => ilham());
}

if ($words_az[0] eq "\@") {
shift @words_az;
$resultat = $::conf_list->proverka(confa => $args{from}, name => "@words_az");
main::SendMessage(to => $args{from}, type => 'groupchat', body => "$resultat");
}
if ($args{resource} eq "Fixer") {
main::SendMessage(to => $args{from}, type => 'groupchat', body => "$args{resource}: ты быдлоохтунг.");
}

# Мониторинг машины
if ($words_az[0] eq "mbmon") {
$mbmon = `mbmon -rc1`;
main::SendMessage(to => $args{from}, type => 'groupchat', body => "\n$mbmon");
}

# Добавление в чмо-список
if ($words_az[0] eq "чмо" && $#words_az > 0 && $words_az[1] ne $::nickname) {
shift @words_az;
undef $rezultat;
   if ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq да) {
      $fh = IO::File->new("+<../chmo");
      @spisok_chma = $fh->getlines;
      foreach (@spisok_chma) {
           utf8::decode($_);
           chomp;
           if ($_ eq "@words_az") {
                $rezultat = "$args{resource}: @words_az уже в списке чмырей";
                last;
           }
      }
      unless ($rezultat) {
               undef $rez_true;
               $fh_true = IO::File->new("+<../true");
               @spisok_true = $fh_true->getlines;
               foreach (@spisok_true) {
                   utf8::decode($_);
                   chomp;
                   if ($_ eq "@words_az") {
                      $rez_true = 1;
                      last;
                   }
               }
		my $kluch = "$args{from}/@words_az";
		@infaonike = split(/\//,$::spisokjidov{$kluch});
		my $kluch2 = "$args{from}/$args{resource}";
		@infaonike2 = split(/\//,$::spisokjidov{$kluch2});
		$rez_true = 1 if (($infaonike[2] eq 'owner' || 
				$infaonike[2] eq 'admin') || 
				($infaonike2[2] ne 'owner' && 
				$infaonike2[2] ne 'admin'));
		undef $rez_true if (@infaonike2[0] eq 'ipse@ipse.zapto.org');
               $fh_true->close;
               if ($rez_true) {
                    $rezultat = "$args{resource}: сосни-ка хуйца быдло";
               } else {
                    print $fh "@words_az\n";
                    $rezultat = "$args{resource}: @words_az добавлен в список чмырей";
               }
      }
      $fh->close;
   } elsif ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq нет) {
      $rezultat = "$args{resource}: @words_az нет в конференции $args{from}";
   } else {
      $rezultat = "$args{resource}: неизвестная ошибка.";
   }
main::SendMessage(to => $args{from}, type => 'groupchat', body => $rezultat);
}

# Добавление в игнор-список
if ($words_az[0] eq "игнор" && $#words_az > 0 && $words_az[1] ne $::nickname) {
shift @words_az;
undef $rezultat;
   if ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq да) {
      $fh = IO::File->new("+<ignor");
      @spisok_ignor = $fh->getlines;
      foreach (@spisok_ignor) {
           utf8::decode($_);
           chomp;
           if ($_ eq "@words_az") {
                $rezultat = "$args{resource}: @words_az уже в игноре";
                last;
           }
      }
      unless ($rezultat) {
               print $fh "@words_az\n";
               $rezultat = "$args{resource}: @words_az добавлен в игнор лист";
      }
      $fh->close;
      
   } elsif ($::conf_list->proverka(confa => $args{from}, name => "@words_az") eq нет) {
      $rezultat = "$args{resource}: @words_az нет в конференции $args{from}";
   } else {
      $rezultat = "$args{resource}: неизвестная ошибка.";
   }
main::SendMessage(to => $args{from}, type => 'groupchat', body => $rezultat);
}

if ($args{body} =~ /(.+): у (.*) клиент.*Win/ && $args{resource} ne $::nickname) {
$nickname_an = $2 eq 'тебя' ? $1 : $2;
main::SendMessage(to => $args{from}, type => 'groupchat', body => "$nickname_an: ты быдлоохтунг!");

}


if ($args{body} =~ /([.0o]_[.0o])/ && $args{resource} ne $::nickname && $args{from} ne 'game@conference.udaff.com') {
$счетчик++;
main::SendMessage(to => $args{from}, type => 'groupchat', body => ".$args{resource}: $1") unless $счетчик % 5;
}


if (($args{body} eq "all:" || $args{body} eq "ĉiuj:") && $args{resource} ne $::nickname) {
main::SendMessage(to => $args{from}, type => 'groupchat', body => "$args{resource}:");
}

}

# Проверка валидности URL
sub validateUrl {
  my($strUrl) = shift;
  return
  $strUrl =~ m!(http:|https:|ftp:)//([A-z\d]+)\:([A-z\d]+)\@([A-z\d\-\.]+\.)+[A-z]!i ||
  $strUrl =~ m!^(http:|https:|ftp:)//([A-z\d\-\.]+\.)+[A-z]!i ||
  $strUrl=~ m!^(http:|https:|ftp:)//(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}!i ||
  $strUrl =~ m!([A-z\d]+)\:([A-z\d]+)\@([A-z\d\-\.]+\.)+[A-z]!i ||
  $strUrl =~ m!^([A-z\d\-\.]+\.)+[A-z]!i ||
  $strUrl=~ m!^(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}!i ? 1 : 0;
}

sub ilham {
    $http = new HTTP::Lite;
    $req = $http->request("http://ojab.ru/qip.py") 
        or die "Unable to get document: $!";
    $body = $http->body();
    my $hs = HTML::Strip->new();
    $body =~ s/\n+//g;
    my $clean_text = $hs->parse($body);
    $hs->eof;
    utf8::decode($clean_text);
    return $clean_text;
}

main::pd("................\n\n\n");
1;